def 计算退休时间(分类, 出生年, 出生月):
    """计算退休时间
参数
    分类 (str 或 int): 表示人员类别。可以是字符串 "男", "女干部", "女职工"，用于常用的人群，
        或者直接指定退休时间的整数，用于按其他政策指定退休年龄的场合，例如男70-女60等。
    出生年 (int): 人员的出生年份。
    出生月 (int): 人员的出生月份。
返回值字典，包含以下键：
    法定退休时间: (年, 月) 元组，表示法定的退休时间。
    退休时年龄: (年, 月) 元组，表示退休时的实际年龄。
    弹性提前退休限制: 如果有提前退休的限制，则为最早的退休时间 (年, 月)；如果没有限制，则为 None。
    延迟退休时长: 如果涉及延迟退休，则为 (年, 月) 元组表示延迟的时间长度；如果不涉及，则为 None。
    """
    if 分类=="女职工" and 出生年==1985 and 出生月==1:
        pass
    结果=None
    # 校验输入参数
    if isinstance(分类, int): #某些特殊人员，指定退休时间，不受法定退休时间控制
        if 分类 >= 50:
            return None
        结果 = {
            "法定退休时间":(出生年+分类,出生月),
            "退休时年龄":(分类,0),
            "弹性提前退休限制":None,
            "延迟退休时长":None,
        }
    elif isinstance(分类, str):
        if 分类 in ["男", "女干部", "女职工"]:
            # 设置原退休年龄、新法定退休年龄以及延长步长表
            原退休年龄表 = {
                "男": 60,
                "女干部": 55,
                "女职工": 50
            }

            新法定退休年龄表 = {
                "男": 63,
                "女干部": 58,
                "女职工": 55
            }

            延长步长表 = {  # 每几个月延迟1个月？
                "男": 4,
                "女干部": 4,
                "女职工": 2
            }

            开始延迟年 = 2025  # 法定，在这个时间之后退休的，才可能涉及延迟退休，因为是整年，月份是1，简化计算只用看年即可
            新法定退休年龄 = 新法定退休年龄表[分类]  # 法定，即最终目标
            原退休年龄 = 原退休年龄表[分类]  # 法定，即原规定的退休年限
            延迟影响开始年 = 开始延迟年 - 原退休年龄  # 即在此年份之后出生的，才会在2025年后退休，才会涉及延迟
            延长步长 = 延长步长表[分类]  # 法定，每几个月延迟1个月？ 整年比例相同
            延迟影响结束年 = 延迟影响开始年 + (
                        新法定退休年龄 - 原退休年龄) * 延长步长  # 即在此年份之后出生的，依据无需逐步过渡，可直接执行新法定退休年龄
            if 出生年 < 延迟影响开始年:
                # 直接按老政策执行退休
                结果 = {
                    "法定退休时间": (出生年 + 原退休年龄, 出生月),
                    "退休时年龄": (原退休年龄, 0),
                    "弹性提前退休限制": None,
                    "延迟退休时长": None,
                }
            elif 出生年 >= 延迟影响结束年:
                # 直接按新政策执行退休
                结果 = {
                    "法定退休时间": (出生年 + 新法定退休年龄, 出生月),
                    "退休时年龄": (新法定退休年龄, 0),
                    "弹性提前退休限制": (出生年 + (max(原退休年龄, 新法定退休年龄 - 3)), 出生月),  # 法定，不得早于原年限，不得超过3年
                    "延迟退休时长": None,
                }
            else:
                # 按过渡期政策执行退休
                延迟月数 = ((出生年 * 12 + 出生月) - (延迟影响开始年 * 12 + 1) + 延长步长) // 延长步长
                延迟后退休月数 = 原退休年龄 * 12 + 延迟月数
                延迟后退休年 = 出生年 + (延迟后退休月数 // 12)
                延迟后退休月 = 出生月 + (延迟后退休月数 % 12)
                if 延迟后退休月 > 12:
                    延迟后退休年 += 1
                    延迟后退休月 -= 12
                结果 = {
                    "法定退休时间": (延迟后退休年, 延迟后退休月),
                    "退休时年龄": (延迟后退休月数 // 12, 延迟后退休月数 % 12),
                    "弹性提前退休限制": (出生年 + (max(原退休年龄, 新法定退休年龄 - 3)), 出生月),  # 法定，不得早于原年限，不得超过3年
                    "延迟退休时长": (延迟月数 // 12, 延迟月数 % 12),
                }
    return 结果


def 计算法定退休时间_sim2(分类, 出生年月):
    """计算法定退休时间简化
    参数:
        分类 (str): 表示人员类别。可以是字符串 "男", "女干部", "女职工"。
        出生年月 (int): 6位数值表示的出生年月，前4位为年，后2位为月。
    返回值:
        int: 6位数值表示的法定退休时间，前4位为年，后2位为月。
    """
    # 解析输入的出生年月
    出生年 = 出生年月 // 100
    出生月 = 出生年月 % 100

    # 设置原退休年龄、新法定退休年龄以及延长步长表
    原退休年龄表 = {
        "男": 60,
        "女干部": 55,
        "女职工": 50
    }

    新法定退休年龄表 = {
        "男": 63,
        "女干部": 58,
        "女职工": 55
    }

    延长步长表 = {  # 每几个月延迟1个月？
        "男": 4,
        "女干部": 4,
        "女职工": 2
    }

    开始延迟年 = 2025  # 法定，在这个时间之后退休的，才可能涉及延迟退休，因为是整年，月份是1，简化计算只用看年即可
    新法定退休年龄 = 新法定退休年龄表[分类]  # 法定，即最终目标
    原退休年龄 = 原退休年龄表[分类]  # 法定，即原规定的退休年限
    延迟影响开始年 = 开始延迟年 - 原退休年龄  # 即在此年份之后出生的，才会在2025年后退休，才会涉及延迟
    延长步长 = 延长步长表[分类]  # 法定，每几个月延迟1个月？ 整年比例相同
    延迟影响结束年 = 延迟影响开始年 + (
            新法定退休年龄 - 原退休年龄) * 延长步长  # 即在此年份之后出生的，依据无需逐步过渡，可直接执行新法定退休年龄

    if 出生年 < 延迟影响开始年:
        # 直接按老政策执行退休
        退休年 = 出生年 + 原退休年龄
        退休月 = 出生月
    elif 出生年 >= 延迟影响结束年:
        # 直接按新政策执行退休
        退休年 = 出生年 + 新法定退休年龄
        退休月 = 出生月
    else:
        # 按过渡期政策执行退休
        延迟月数 = ((出生年 * 12 + 出生月) - (延迟影响开始年 * 12 + 1) + 延长步长) // 延长步长
        延迟后退休月数 = 原退休年龄 * 12 + 延迟月数
        退休年 = 出生年 + (延迟后退休月数 // 12)
        退休月 = 出生月 + (延迟后退休月数 % 12)
        if 退休月 > 12:
            退休年 += 1
            退休月 -= 12
    return 退休年*100+退休月
def 计算法定退休时间_sim(分类, 出生年月):
    """计算法定退休时间简化
    参数:
        分类 (str): 表示人员类别。可以是字符串 "男", "女干部", "女职工"。
        出生年月 (int): 6位数值表示的出生年月，前4位为年，后2位为月。
    返回值:
        int: 6位数值表示的法定退休时间，前4位为年，后2位为月。
    """

    def EDATE(年月, 增加月):
        年 = 年月 // 100
        月 = 年月 % 100
        # 计算新的月份和年份
        新月 = 月 + 增加月
        新年 = 年 + (新月 - 1) // 12
        新月 = (新月 - 1) % 12 + 1  # 确保月份在1到12之间
        return 新年 * 100 + 新月
    # 解析输入的出生年月
    出生年 = 出生年月 // 100
    出生月 = 出生年月 % 100

    if 分类=="男":
        c开始影响年=1965
        c原年限=60
        c最长延迟年限=3
        c_延迟步长=4
    elif 分类=="女干部":
        c开始影响年=1970
        c原年限=55
        c最长延迟年限=3
        c_延迟步长=4
    elif  分类=="女职工":
        c开始影响年=1975
        c原年限=50
        c最长延迟年限=5
        c_延迟步长=2
    else:
        return None
    if 出生年<c开始影响年:
        return (出生年+c原年限)*100+出生月
    else:
        #  =EDATE(DATE(YEAR(B1),MONTH(B1),1),MIN(QUOTIENT(YEAR(B1)*12+MONTH(B1)-(1965*12+1)+4,4),3*12)+60*12)
        # return min((出生年*12+出生月-(c开始影响年*12+1)+c_延迟步长) // c_延迟步长 ,c最长延迟年限*12)
        return EDATE(出生年月, min((出生年*12+出生月-(c开始影响年*12+1)+c_延迟步长) // c_延迟步长 ,c最长延迟年限*12) + c原年限*12)
""" 我要一个excel公式，
    最外层用if 区分A1内容
        如果是 "男":
           二级if 如果 YEAR(B1) <1965 返回 DATE(YEAR(B1)+60,MONTH(B1),1)
           否则返回 EDATE(DATE(YEAR(B1),MONTH(B1),1),MIN(QUOTIENT(YEAR(B1)*12+MONTH(B1)-(1965*12+1)+4,4),3*12)+60*12)
        如果是 "女干部":
            二级if 如果 YEAR(B1) <1970 返回 DATE(YEAR(B1)+55,MONTH(B1),1)
            否则返回 EDATE(DATE(YEAR(B1),MONTH(B1),1),MIN(QUOTIENT(YEAR(B1)*12+MONTH(B1)-(1970*12+1)+4,4),3*12)+55*12)
        如果是 "女职工"：
            二级if 如果 YEAR(B1) <1975 返回 DATE(YEAR(B1)+50,MONTH(B1),1)
            否则返回 EDATE(DATE(YEAR(B1),MONTH(B1),1),MIN(QUOTIENT(YEAR(B1)*12+MONTH(B1)-(1975*12+1)+2,2),512)+50*12)
        其他值:
          返回 "错误的类型"
    AI给的公式：
    =IF(A1="男",
    IF(YEAR(B1) < 1965,
        DATE(YEAR(B1)+60, MONTH(B1), 1),
        EDATE(DATE(YEAR(B1), MONTH(B1), 1), MIN(QUOTIENT((YEAR(B1)*12 + MONTH(B1) - (1965*12 + 1) + 4), 4), 3*12) + 60*12)
    ),
    IF(A1="女干部",
        IF(YEAR(B1) < 1970,
            DATE(YEAR(B1)+55, MONTH(B1), 1),
            EDATE(DATE(YEAR(B1), MONTH(B1), 1), MIN(QUOTIENT((YEAR(B1)*12 + MONTH(B1) - (1970*12 + 1) + 4), 4), 3*12) + 55*12)
        ),
        IF(A1="女职工",
            IF(YEAR(B1) < 1975,
                DATE(YEAR(B1)+50, MONTH(B1), 1),
                EDATE(DATE(YEAR(B1), MONTH(B1), 1), MIN(QUOTIENT((YEAR(B1)*12 + MONTH(B1) - (1975*12 + 1) + 2), 2), 5*12) + 50*12)
            ),
            "错误的类型"
        )
    )
)
    
"""




if __name__ == "__main__":
    测试数据 = [
        {"分类": "男", "开始时间": (1965-5, 1), "结束时间": (1977+5, 1)},
        {"分类": "女干部", "开始时间": (1970-5, 1), "结束时间": (1982+5, 1)},
        {"分类": "女职工", "开始时间": (1975-5, 1), "结束时间": (1985+5, 1)}
    ]
    # 测试数据 = [
    #     {"分类": "男", "开始时间": (1965, 1), "结束时间": (1977, 1)},
    #     {"分类": "女干部", "开始时间": (1970, 1), "结束时间": (1982, 1)},
    #     {"分类": "女职工", "开始时间": (1975, 1), "结束时间": (1985, 1)}
    # ]
    for 数据 in 测试数据:
        分类 = 数据["分类"]
        开始时间 = 数据["开始时间"]
        结束时间 = 数据["结束时间"]
        行号=1
        print(f"测试 {分类} 类别:")
        当前年, 当前月 = 开始时间
        while (当前年, 当前月) < 结束时间:
            结果 = 计算退休时间(分类, 当前年, 当前月)
            退休时年龄=f"{结果['退休时年龄'][0]}岁"
            if 结果['退休时年龄'][1]!=0:
                退休时年龄=退休时年龄+f"{结果['退休时年龄'][1]}个月"
            延迟时长="不涉及"
            if 结果['延迟退休时长']!=None:
                延迟时长 = ""
                if 结果['延迟退休时长'][0] != 0:
                    延迟时长=f"{结果['延迟退休时长'][0]}年"
                if 结果['延迟退休时长'][1]!=0:
                    延迟时长=延迟时长+f"{结果['延迟退休时长'][1]}个月"
            弹性提前="不涉及"
            if 结果['弹性提前退休限制'] != None:
                弹性提前="最早%04d-%02d"%结果['弹性提前退休限制']


            print("%03d"%行号,分类,"出生:%04d-%02d"%(当前年,当前月),f"退休时年龄:{退休时年龄}","法定退休时间:%04d-%02d"%(结果["法定退休时间"][0],结果["法定退休时间"][1]),f"延迟:{延迟时长}",f"弹性提前退休:{弹性提前}")
            行号+=1
            # 月份递增逻辑
            当前月 += 1
            if 当前月 > 12:
                当前月 = 1
                当前年 += 1
        print("-" * 40)
